#include "stm32f10x.h"                  // Device header

void MySPI_W_SS(uint8_t BitValue)										//为了写入SS的片选，只需要改变0 / 1变量即可
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)BitValue);
}

void MySPI_W_SCK(uint8_t BitValue)										//为了写入SCK的时序，只需要改变0 / 1变量即可
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_5,(BitAction)BitValue);
}

void MySPI_W_MOSI(uint8_t BitValue)										//主机写入，从机输出的数据，只需要改变0 / 1变量即可
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_7,(BitAction)BitValue);
}

uint8_t MySPI_R_MISO(void)												//主机输出，从机输入，只需要读一位即可
{
	return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);
}

void MySPI_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);								//将PA4、PA5和PA7引脚初始化为推挽输出

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);								//将PA6引脚初始化为上拉输入
	
	/*设置默认电平*/
	MySPI_W_SS(1);														//SS默认高电平
	MySPI_W_SCK(0);														//SCK默认低电平
}

void MySPI_Star(void)													//SPI开始，直接片选给0
{
	MySPI_W_SS(0);
}

void MySPI_Stop(void)													//SPI结束，直接片选给1
{
	MySPI_W_SS(1);
}

uint8_t MySPI_SwapByte(uint8_t ByteSend)								//SPI发送和接收，是两边同时进行的，都会有数据来
{
	//法一：掩码的方式，就是一位一位 &和|的方式发送
	uint8_t i,ByteReceive = 0x00;										//SPI接收的数据放到ByteReceive
	for(i=0; i<8; i++)
	{
		MySPI_W_MOSI(ByteSend & (0x80>>i));								//发送的数据和0x80与上就是发送的数据是0 / 1
		MySPI_W_SCK(1);													//拉高SCK，上升沿移出数据
		if(MySPI_R_MISO() == 1)											//如果接收到了数据，等于1，就需要或上0x80，让其变为1
		{
			ByteReceive = ByteReceive | (0x80>>i);						//读取MISO数据，并存储到Byte变量
																		//当MISO为1时，置变量指定位为1，当MISO为0时，不做处理，指定位为默认的初值0
		}
		MySPI_W_SCK(0);													//拉低SCK，下降沿移入数据
	}
	return ByteReceive;
	
	//法二：直接移位，只不过这个会改变原本ByteSend的数据
//	uint8_t i = 0x00;										//SPI接收的数据放到ByteReceive
//	for(i=0; i<8; i++)
//	{
//		MySPI_W_MOSI(ByteSend & 0x80);									//发送的数据直接和ByteSend最高位与，就是最高位
//		ByteSend = ByteSend << i;										//只不过这里，就是用过的高位移走，低位会补0
//		MySPI_W_SCK(1);												
//		if(MySPI_R_MISO() == 1)											//如果接收到了数据，等于1，然后直接把ByteSend或上最低位的1
//		{
//			ByteSend = ByteSend | 0x01;									//最低为不断的与上 1，就是新来的数据，如果不需要，上面移位也移走了
//		}
//		MySPI_W_SCK(0);													
//	}
//	return ByteSend;
}

